package object_;

/**
 * 关于Object类的equals方法，看jdk原码
 */
public class Test {
    public static void main(String[] args) {
        Object o = new Object();
        Object o1 = new Object();
        /*
        jdk 关于objeck类的原码
        public boolean equals(Object obj) {
            return (this == obj);
        }
        实际上是比较地址
        这个this就是调用的对象，也就是object实例，
        在本例子中 this 就是 o
        obj就是 就是 o1
        对于 == ，引用类型是比较地址，基本类型比较值
        */
//        System.out.println(o.equals(o1));//false，地址不相等

        //字符串重写
        String s1  = "abc";
        String s2 = "abc" ;
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));//true[字符串常量池里面，实际上是同一个对象]
        String s3 = new String("abc");
        String s4 = new String("abc");
        System.out.println(s3==s4);//false
        System.out.println(s3.equals(s4));
//        System.out.println(s1==s2);
        /*
        public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;//如果直接比地址都成功了，那就是相等，不用判断值了
        }
        if (anObject instanceof String) { //看比较的参数是不是String
            String anotherString = (String)anObject;//向下转型，把object转化成String类型
            int n = value.length;//String的长度
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {//一个一个字符比较
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        //比较的参数都不是String类型，直接返回false
        return false;
    }
         */

    }
}
